/**
 * 通用地图中间件 V 2.0.0
 * @time 2025-3-18 11:35:02
 * @version 2.0.0
 * @author syz
 */

/**
 * 图元类型
 * @typedef { Object } OVERLAY_TYPE 图元类型
 * @enum { string } 点线面等常用图元类型
 */
const OVERLAY_TYPE = {
  POINT: 'point',
  BILLBOARD: 'billboard',
  POLYLINE: 'polyline',
  POLYGON: 'polygon',
  CIRCLE: 'circle',
  RECT: 'rect',
  LABEL: 'label',
  SECTOR: 'sector',
  ELLIPSE: 'ellipse',
  ARCH: 'arch',
  DOT_SYMBOL: 'dot_symbol',
  LINE_POLYGON_SYMBOL: 'line_polygon_symbol',
  GRID: 'grid',
  CHANNEL: 'channel',
  HEATMAP: 'heatmap',
  MARKER_LINE: 'marker_line',
  MOVE_ENTITY: 'move_entity',
  FIRE_OPEN: 'fire_open'
}

/**
 * 图层类型
 * @typedef {Object} LAYER_TYPE 图层类型
 * @enum {string}
 */
const LAYER_TYPE = {
  GRAPHIC: 'graphic', // 矢量图层
  WMTS: 'wmts', // wmts图层
  TMS: 'tms', // tms图层
  WMS: 'wms', // wms图层
  XYZ: 'xyz', // xyz图层
  GEOJSON: 'geojson', // geojson图层
  TER: 'ter' // 地形图层
}

/**
 * 二三维莫斯切换
 * @typedef {Object} SCENE_MODE
 * @type {{SCENE2_5D: number, SCENE2D: number, SCENE3D: number}} 二维/三维/2.5维
 */
const SCENE_MODE = {
  SCENE2D: 2,
  SCENE3D: 3,
  SCENE2_5D: 2.5
}

/**
 * 图层配置
 * @typedef {Object} LayerOptions
 * @property {LAYER_TYPE} type 图层类型
 */

/**
 * 事件类型
 * @typedef {Object} EVENT_TYPE 事件类型
 * @enum {string} 图元、图层、全局事件类型
 */
const EVENT_TYPE = {
  CLICK: 'click',
  CLOCK_TICK: 'CLOCK_TICK',
  LEFT_UP: 'left_up',
  LEFT_DOWN: 'left_down',
  RIGHT_UP: 'right_up',
  RIGHT_DOWN: 'right_down',
  DB_CLICK: 'db_click',
  RIGHT_CLICK: 'right_click',
  MOUSE_MOVE: 'mouse_move',
  CONTEXTMENU: 'contextmenu',
  ADD_OVERLAY: 'add_overlay',
  REMOVE_OVERLAY: 'remove_overlay',
  OVERLAY_CLICK: 'overlay_click',
  OVERLAY_EDIT: 'overlay_edit',
  EDIT_START: 'edit_start',
  EDIT_STOP: 'edit_stop'
}

/**
 * 事件范围
 * @typedef {Object} EVENT_RANGE 事件范围
 * @enum {string} global | layer | overlay
 */
const EVENT_RANGE = {
  GLOBAL: 'global',
  LAYER: 'layer',
  OVERLAY: 'overlay'
}

/**
 * 图元材质
 * @typedef {Object} MATERIAL_TYPE
 * @enum {string} 图元材质类型
 */
const MATERIAL_TYPE = {
  Color: 'Color', // 纯色的
  Image: 'Image', // 图片
  PolylineDash: 'PolylineDash', // 虚线
  PolylineArrow: 'PolylineArrow' // 箭头线
}

/**
 * 位置配置信息
 * @typedef {Object} Position
 * @property {number} lng 经度
 * @property {number} lat 纬度
 * @property {number} height 高度
 */

/**
 * 文字样式配置
 * @typedef {Object} TextConfig
 * @property {string} text 文本信息
 * @property {TextStyle} textStyle 文本样式
 */

/**
 * 文字样式
 * @typedef {Object} TextStyle
 * @property {string} color 文本颜色
 * @property {boolean} outline 是否边框
 * @property {string} outlineColor 边框颜色
 * @property {number} outlineWidth 边框粗细
 * @property {boolean} background 是否添加背景色
 * @property {string} backgroundColor 背景颜色
 * @property {number} backgroundOpacity 背景色透明度
 * @property {number} font_size 文本大小
 * @property {string} font_weight 文本粗细
 * @property {string} font_style 文本斜体
 * @property {string} font_family 文本字体
 * @property {boolean} visible 文本显隐
 * @property {number} pixelOffsetX 文本X方向偏移量
 * @property {number} pixelOffsetY 文本Y方向偏移量
 */

/**
 * 回调函数
 * @callback CallbackFunction
 * @param {Object} callbackData 回调函数数据
 * @returns {void}
 */

/**
 * 点图元样式配置
 * @typedef {Object} PointStyle
 * @property {string} color 颜色
 * @property {MATERIAL_TYPE} material 材质
 * @property {Object} materialOptions 材质配置参数
 * @property {Boolean} visible 是否显示
 */

/**
 * 点图元配置信息
 * @typedef { Object } PointOptions
 * @property {Position} geometry 点位
 * @property {PointStyle} style 点样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 文本图元配置信息
 * @typedef { Object } LabelOptions
 * @property {Position} geometry 文本位
 * @property {TextStyle} style 文本样式
 * @property {string} text 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 点图元样式配置
 * @typedef {Object} BillboardStyle
 * @property {string} image 图片地址
 * @property {string} color 颜色
 * @property {number} opacity 透明度
 * @property {number} scale 图片缩放比例
 * @property {number} width 图片宽度
 * @property {number} height 图片高度
 * @property {number} rotation 图片旋转角度
 * @property {Boolean} visible 是否显示
 */

/**
 * 点图元配置信息
 * @typedef { Object } BillboardOptions
 * @property {Position} geometry 点位
 * @property {BillboardStyle} style 点样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 线图元样式配置
 * @typedef {Object} PolylineStyle
 * @property {MATERIAL_TYPE} materialType 材质
 * @property {Object} materialOptions 材质配置参数
 */

/**
 * 线图元配置信息
 * @typedef { Object } PolylineOptions
 * @property {Position[]} geometry 点位集合
 * @property {PolylineStyle} style 线样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 面图元样式配置
 * @typedef {Object} PolygonStyle
 * @property {string} color 颜色
 * @property {boolean} outline 是否边框
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {MATERIAL_TYPE} material 材质
 * @property {Object} materialOptions 材质配置参数
 * @property {Boolean} visible 是否显示
 */

/**
 * 面图元配置信息
 * @typedef { Object } PolygonOptions
 * @property {Position[]} geometry 点位集合
 * @property {PolygonStyle} style 多边形样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 矩形图元样式配置
 * @typedef {Object} RectStyle
 * @property {string} color 颜色
 * @property {boolean} outline 是否边框
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {MATERIAL_TYPE} material 材质
 * @property {Object} materialOptions 材质配置参数
 * @property {Boolean} visible 是否显示
 */

/**
 * 矩形图元配置信息
 * @typedef { Object } RectOptions
 * @property {Position[]} geometry 点位集合
 * @property {RectStyle} style 矩形样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 图层样式配置
 * @typedef {Object} LayerStyle 图层样式
 * @property {boolean} show 图层是否显示
 */

/**
 * 圆形图元样式配置
 * @typedef {Object} CircleStyle
 * @property {number} radius 半径
 * @property {string} color 颜色
 * @property {boolean} outline 是否边框
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {MATERIAL_TYPE} material 材质
 * @property {Object} materialOptions 材质配置参数
 * @property {Boolean} visible 是否显示
 */

/**
 * 圆形图元配置信息
 * @typedef { Object } CircleOptions
 * @property {Position} geometry 集合中心位置
 * @property {CircleStyle} style 圆形样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 椭圆图元样式配置
 * @typedef {Object} EllipseStyle
 * @property {number} semiMajorAxis 长半轴
 * @property {number} semiMinorAxis 短半轴
 * @property {string} color 颜色
 * @property {boolean} outline 是否边框
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {MATERIAL_TYPE} material 材质
 * @property {Object} materialOptions 材质配置参数
 * @property {Boolean} visible 是否显示
 */

/**
 * 椭圆形图元配置信息
 * @typedef { Object } EllipseOptions
 * @property {Position} geometry 椭圆中心位置
 * @property {EllipseStyle} style 椭圆样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 饼图元样式配置
 * @typedef {Object} SectorStyle
 * @property {number} startAngle 起始方位角
 * @property {number} endAngle 结束方位角
 * @property {number} radius 饼半径
 * @property {number} innerRadius 内径
 * @property {string} color 颜色
 * @property {boolean} outline 是否边框
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {MATERIAL_TYPE} material 材质
 * @property {Object} materialOptions 材质配置参数
 * @property {Boolean} visible 是否显示
 */

/**
 * 饼图元配置信息
 * @typedef { Object } SectorOptions
 * @property {Position} geometry 饼中心位置
 * @property {SectorStyle} style 饼图元样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 弓形图元样式配置
 * @typedef {Object} ArchStyle
 * @property {number} startAngle 起始方位角
 * @property {number} endAngle 结束方位角
 * @property {number} radius 饼半径
 * @property {string} color 颜色
 * @property {boolean} outline 是否边框
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {MATERIAL_TYPE} material 材质
 * @property {Object} materialOptions 材质配置参数
 * @property {Boolean} visible 是否显示
 */

/**
 * 弓形图元配置信息
 * @typedef { Object } ArchOptions
 * @property {Position} geometry 饼中心位置
 * @property {ArchStyle} style 饼图元样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 点军标图元样式配置
 * @typedef {Object} DotSymbolStyle
 * @property {number} width 宽度
 * @property {number} height 高度
 * @property {string} color 颜色
 * @property {string} outlineColor 边框颜色
 * @property {number} outlineWidth 边框宽度
 * @property {string} imgUrl 图片url地址
 * @property {Boolean} visible 是否显示
 */

/**
 * 点军标图元配置信息
 * @typedef { Object } DotSymbolOptions
 * @property {Position} geometry 点军标中心位置
 * @property {number} libID 库id
 * @property {number} codeID 军标code码
 * @property {DotSymbolStyle} style 点军标图元样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 复杂线面军标图元样式配置
 * @typedef {Object} LinePolygonSymbolStyle
 * @property {string} color 颜色
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {Boolean} visible 是否显示
 */

/**
 * 点军标图元配置信息
 * @typedef { Object } LinePolygonSymbolOptions
 * @property {Position[]} geometry 复杂线面军标位置集合
 * @property {LinePolygonSymbolStyle} style 复杂线面军标图元样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 地图初始化配置参数
 * @typedef {Object} MapOptions
 * @property {string|HTMLElement} container 挂载的html要素的id或者容器
 * @property {CallbackFunction} callback 挂载完毕后的回调函数
 */

/**
 * 地图中间件类
 * @typedef {Object} MapMiddleware
 * @property {Object} map 地图对象
 * @property {Object} sdk gis引擎库
 */

/**
 * 复杂线面军标图元样式配置
 * @typedef {Object} ChannelStyle
 * @property {string} color 颜色
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {Boolean} visible 是否显示
 */

/**
 * 点军标图元配置信息
 * @typedef { Object } ChannelOptions
 * @property {Position[]} geometry 复杂线面军标位置集合
 * @property {ChannelStyle} style 复杂线面军标图元样式
 * @property {TextConfig} label 文本信息
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 复杂线面军标图元样式配置
 * @typedef {Object} GridStyle
 * @property {string} color 颜色
 * @property {number} outlineWidth 边框宽度
 * @property {PolylineStyle} outlineStyle 边框样式
 * @property {Boolean} visible 是否显示
 */

/**
 * 点军标图元配置信息
 * @typedef { Object } GridOptions
 * @property {Position[]} geometry 复杂线面军标位置集合
 * @property {ChannelStyle} style 复杂线面军标图元样式
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 复杂线面军标图元样式配置
 * @typedef {Object} FireOpenStyle
 * @property {string} color 颜色
 * @property {number} speed 攻击速度
 * @property {number} radius 攻击范围
 * @property {Boolean} visible 是否显示
 */

/**
 * 火力打击效果图元配置信息
 * @typedef { Object } FireOpenOptions 火力打击效果配置参数
 * @property {Position[]} firePositions 攻击点位集合
 * @property {Position} targetPosition 目标位置
 * @property {FireOpenStyle} style 复杂线面军标图元样式
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 标记线图元样式信息
 * @typedef { Object } MarkerLineStyle
 * @property {boolean} lineVisible 线是否可见
 * @property {string} lineType dash | solid 线型
 * @property {number} lineWidth 线宽
 * @property {number} dashLength 虚线长度，仅当线型为dash时有效
 * @property {boolean} labelVisible 文本可见性
 * @property {string} labelType 标注的类型 center 中心分布 equidistant 等距分布
 * @property {string} labelOrder 标注的顺序 forward 与线走向相同 backward 与线走向相反
 * @property {number} labelScale 标注缩放比例 1.0
 * @property {number} fontSize 文本大小
 * @property {number} fontFamily 字体样式
 * @property {string} fontColor 字体颜色
 */

/**
 * 标记线图元配置信息
 * @typedef { Object } MarkerLineOptions
 * @property {Position[]} geometry 标记线起始与结束位置集合
 * @property {string} text 标记线标记文本信息
 * @property {LinePolygonSymbolStyle} style 复杂线面军标图元样式
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 热力图配置参数
 * @typedef {Object} HeatMapItem
 * @property {number} lng 经度
 * @property {number} lat 纬度
 * @property {number} value 经纬度对应的数值
 */

/**
 * 点军标图元配置信息
 * @typedef { Object } HeatMapOptions
 * @property {HeatMapItem[]} data 热力图可视化数据
 * @property {number} radius 热力图影响半径
 * @property {number} minOpacity 热力图最小透明度
 * @property {number} maxOpacity 热力图最大透明度
 * @property {Object} gradient 热力图数值对应颜色
 * @property {CallbackFunction} callback 回调函数
 */

/**
 * 动目标图元配置信息
 * @typedef { Object } TrackOptions
 * @property {Object[]} data 动目标时空位置序列数据
 * @property {Overlay[]} overlays 绑定的动目标对象
 * @property {CallbackFunction} posChangeCallback 位置更新回调函数
 * @property {CallbackFunction} callback 图元添加回调函数
 */

/**
 * @typedef {Object} Orientation
 * @property {number} heading
 * @property {number} pitch
 * @property {number} roll
 */

/**
 * 相机视角控制
 * @typedef {Object} FlyToOptions
 * @property {Position} destination 飞向目的地
 * @property {Orientation} orientation 飞向目标的姿态
 * @property {number} duration 持续时间
 * @property {CallbackFunction} callback 回调函数
 */

const CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(
  ''
)

const ColorGradient = {
  REDGREEN: [
    '#006837',
    '#1a9850',
    '#66bd63',
    '#a6d96a',
    '#d9ef8b',
    '#ffffbf',
    '#fee08b',
    '#fdae61',
    '#f46d43',
    '#d73027',
    '#a50026'
  ], // 环境适应性的温度
  BLUE: [
    '#D9E7FF',
    '#C4DAFF',
    '#A8C9FF',
    '#85B3FF',
    '#5B98FF',
    '#2D7CFF',
    '#0060FF',
    '#0056E6',
    '#0049C4',
    '#003A9D',
    '#002C76'
  ], // 环境适应性降雨量
  GRAY: [
    '#F4F4F4',
    '#EEEEEE',
    '#E5E5E5',
    '#DDDDDD',
    '#D0D0D0',
    '#C0C0C0',
    '#ADADAD',
    '#989898',
    '#808080',
    '#666666',
    '#4B4B4B'
  ], //灰度
  RED: [
    '#FFEDE9',
    '#FFDCD4',
    '#FFC4B7',
    '#FFAB98',
    '#FF967E',
    '#FF6947',
    '#FF4419',
    '#FF3000',
    '#E62B00',
    '#B82200',
    '#931B00',
    '#671300'
  ],
  ORANGE: [
    '#FFEBD8',
    '#FFD7B2',
    '#FFCE9F',
    '#FFBD7E',
    '#FFA147',
    '#FF8A19',
    '#FF7E00',
    '#E87100',
    '#CC6400',
    '#AB5300',
    '#813E00'
  ],
  YELLOW: [
    '#FFF5D9',
    '#FFEFBF',
    '#FFE69D',
    '#FFDC74',
    '#FFC519',
    '#FFC000',
    '#F3B600',
    '#DBA300',
    '#BA8B00',
    '#956F00',
    '#705400'
  ],
  GREEN: [
    '#CBE4C9',
    '#B3D7B0',
    '#96C792',
    '#75B570',
    '#52A34C',
    '#2D8F26',
    '#087B00',
    '#076900',
    '#065400',
    '#054100'
  ],
  BLUEGREEN: [
    '#D6E9E7',
    '#BDDCD9',
    '#9ECCC7',
    '#79B9B1',
    '#51A59A',
    '#268F81',
    '#006F61',
    '#006054',
    '#005147',
    '#00433A'
  ],
  PURPLE: [
    '#E7DCEF',
    '#DACAE6',
    '#CAB2DB',
    '#B594CD',
    '#9D71BD',
    '#834CAC',
    '#68269A',
    '#4D0088',
    '#420074',
    '#35005D'
  ],
  PINK: [
    '#FFD1FD',
    '#FFB9FC',
    '#FF99FA',
    '#FF71FB',
    '#FF3FF7',
    '#FF00F6',
    '#E600DD',
    '#BD00B6',
    '#9C0095',
    '#7A0073'
  ]
}

/**
 * 公共工具类
 */
class Util {
  /**
   * 生成唯一的uuid
   * @param prefix
   * @return {string}
   */
  uuid(prefix = 'D') {
    let uuid = []
    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
    uuid[14] = '4'
    let r
    for (let i = 0; i < 36; i++) {
      if (!uuid[i]) {
        r = 0 | (Math.random() * 16)
        uuid[i] = CHARS[i === 19 ? (r & 0x3) | 0x8 : r]
      }
    }
    return prefix + '-' + uuid.join('')
  }
}

/**
 * 地图中间件类，方法可拓展
 */
/**
 *
 */
class ZXMapMiddleware {
  /**
   * 地图对象
   * @type {Object}
   */
  map
  /**
   * gis引擎对象
   * @type {Object}
   */
  sdk

  /**
   * 事件对象集合
   */
  events

  /**
   * 图层对象
   */
  layers

  /**
   * 图元对象
   */
  overlays

  constructor(options = {}) {
    this.options = options
    // 地图对象
    this.map = null
    // sdk对象
    this.sdk = null
    // 事件对象
    this.events = []
    this.layers = []
    this.overlays = []
  }

  /**
   * 初始化地图对象
   * 同时需要初始化 map 对象和 sdk 对象
   * @param {MapOptions} options
   */
  initMap(options) {
    const { container, callback } = options
    // const {container} = options
    // this.containterID = container;
    // // 地图对象
    // this.map = new GeoVis.Earth(container);
    // // sdk对象
    // this.sdk = GeoVis;
  }

  /**
   * 相机视角控制
   * @param {FlyToOptions} options
   */
  flyTo(options) {}

  /**
   * 设置时间轴的属性
   * @param startTime 时间轴开始时间
   * @param endTime 时间轴结束时间
   * @param currentTime 时间轴当前时间，默认等于开始时间
   * @param multiplier 时间速率
   */
  setTimeLine(startTime, endTime, currentTime, multiplier = 1.0) {}

  /**
   * 添加动目标
   * @param {string} id
   * @param {TrackOptions} options
   */
  addTrack(id, options) {}

  /**
   * 基于指定id获取动目标对象
   * @param id 动目标id
   */
  getTrack(id) {}

  /**
   * 删除指定id的动目标
   * @param id
   */
  removeTrack(id) {}

  /**
   * 清空动目标集合
   */
  clearTrack() {}

  /**
   * 新增图层
   * @param {string} id 图层id
   * @param {LayerOptions} options 图层配置参数
   */
  addLayer(id, options) {}

  /**
   * 基于图层id获取图层
   * @param {*} id
   */
  getLayer(id) {}

  /**
   * 获取所有的图层
   */
  getLayers() {}

  /**
   * 遍历每一个图层
   * @param {CallbackFunction} callback 回调函数
   */
  eachLayer(callback) {}

  /**
   * 配置图层演示
   * @param {string} id 图层id
   * @param {LayerStyle} style 图层配置样式
   */
  setLayer(id, style) {}

  /**
   * 基于图层id删除图层
   * @param {*} id
   */
  removeLayer(id) {}

  /**
   * 新增地图上图对象
   * @param {String} layerId 上图图层的唯一id
   * @param {string} id 上图图元对象唯一id
   * @param {OVERLAY_TYPE} type 上图图元类型
   * @param {PointOptions | PolygonOptions | PolylineOptions | RectOptions | CircleOptions | ArchOptions | SectorOptions |
   * DotSymbolOptions | LinePolygonSymbolOptions | LabelOptions | ChannelOptions | GridOptions | HeatMapOptions} options 上图对象配置参数，针对不同的上图对象，配置参数构成不同对象
   *
   */
  addOverlay(layerId, id, type, options = {}) {}

  /**
   * 基于图元id获取图元
   * @param {*} id
   */
  getOverlay(id) {}

  /**
   * 基于图元id设置图元属性
   * @param {string} id
   * @param {PointOptions | PolygonOptions | PolylineOptions | RectOptions | CircleOptions |
   * ArchOptions | SectorOptions | DotSymbolOptions | LinePolygonSymbolOptions | LabelOptions |
   * ChannelOptions | GridOptions | HeatMapOptions} options
   */
  setOverlay(id, options = {}) {
    setTimeout()
  }

  /**
   * 遍历图层的每一个图元对象
   * @param {string} layerId 图层id
   * @param {CallbackFunction} callback 遍历的回调函数
   */
  eachOverlay(layerId, callback) {}

  /**
   * 基于图元对象id删除该对象
   * @param {*} id
   */
  removeOverlay(id) {}

  /**
   * 删除所有的图元对象
   * @param {string} [layerId] - 可选指定清空图元的图层id
   */
  clearOverlays(layerId) {}

  /**
   * 绑定Popup弹窗事件
   * @param {string | Object} overlay 图元实体
   * @param {string} context
   * @param {Object} options
   */
  bindPopup(overlay, context, options = {}) {}

  /**
   * 是否显隐 popup弹窗
   * @param overlay 图元
   * @param show 是否显示
   */
  showPopup(overlay, show) {}

  /**
   * 某个图元是否有弹窗
   * @param overlay
   */
  hasPopup(overlay) {}

  /**
   * 取消绑定图元对象的弹窗
   * @param overlay 图元
   */
  unbindPopup(overlay) {}

  /**
   * 绑定Popup提示框事件
   * @param {string | Object} overlay 图元实体
   * @param {string} context
   * @param {Object} options
   */
  bindTooltip(overlay, context, options = {}) {}

  /**
   * 取消绑定图元对象的提示框
   * @param overlay 图元
   */
  unbindTooltip(overlay) {}

  /**
   * 绘制图元
   * @param {string} layerId 标绘图元的图层id
   * @param {OVERLAY_TYPE} type 标绘图元类型
   * @param {PointOptions | PolygonOptions | PolylineOptions | RectOptions | CircleOptions | ArchOptions | SectorOptions |
   * DotSymbolOptions | LinePolygonSymbolOptions | GridOptions | HeatMapOptions} options 标绘图元的配置参数
   */
  drawOverlay(layerId, type, options = {}) {}

  /**
   * 基于图元对象id编辑该图元对象
   * @param {string} id
   * @param {PointOptions | PolygonOptions | PolylineOptions | RectOptions | CircleOptions | ArchOptions | SectorOptions |
   * DotSymbolOptions | LinePolygonSymbolOptions | GridOptions | HeatMapOptions} options
   */
  editOverlay(id, options = {}) {}

  /**
   * 加载场景
   * @param {Object} json
   */
  loadScene(json) {}

  /**
   * 导出场景为JSON
   * @return {string} 场景反序列化对象
   */
  exportScene() {}

  /**
   * @typedef {Object} EventOptions 事件类型配置项
   * @property {EVENT_RANGE} targetType 事件绑定目标类型, global-全局 layer-图层 overlay-图元
   * @property {string | Object} target 事件绑定对象或者id
   * @property {CallbackFunction} callback 事件调用回调事件
   */

  /**
   * 事件绑定（全局、图层、图元）
   * @param eventId {String} 事件的唯一Id
   * @param {EventOptions} options
   */
  bindEvent(eventId, options = {}) {}

  /**
   * 取消一个事件
   * @param {*} eventId 事件id
   */
  unbindEvent(eventId) {}

  /**
   * 二三维切换
   * @param {SCENE_MODE} mode 2/3/2.5 - 二维/三维/2.5维
   */
  changeSceneMode(mode) {}

  /**
   * 获取当前是二维还是三维
   * @return {SCENE_MODE} 当前场景模式
   */
  getSceneMode() {}

  /**
   * 大地坐标转屏幕坐标
   */
  wgs84ToWindowCoordinates(wgs84) {}

  /**
   * 获取地图对象
   * @returns
   */
  getMap() {
    return this.map
  }

  /**
   * 获取GIS引擎对象
   * @returns
   */
  getSdk() {
    return this.sdk
  }

  /**
   * 获取canvas画布
   * @return {HTMLElement}
   */
  getCanvas() {
    return this.map.scene.canvas
  }
}

/**
 * 全局挂载
 */
const mapAbstractInstance = new ZXMapMiddleware()
mapAbstractInstance.Util = Util
mapAbstractInstance.COLOR_GRADIENT = ColorGradient
mapAbstractInstance.OVERLAY_TYPE = OVERLAY_TYPE
mapAbstractInstance.LAYER_TYPE = LAYER_TYPE
mapAbstractInstance.EVENT_TYPE = EVENT_TYPE
mapAbstractInstance.EVENT_RANGE = EVENT_RANGE
mapAbstractInstance.MATERIAL_TYPE = MATERIAL_TYPE
mapAbstractInstance.SCENE_MODE = SCENE_MODE

window.MapInstance = mapAbstractInstance

/**
 * 导出地图中间件
 */
// export default mapAbstractInstance;
